package com.bbva.kyfb.kyfbdaofo.implement;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Vector;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import com.bbva.jee.arq.spring.core.contexto.ArqSpringContext;
import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.jee.arq.spring.core.util.excepciones.PropiedadNoEncontradaExcepcion;
import com.bbva.kyfb.kyfbdto.firmas.errores.Errores_kyfb_servicios;
import com.bbva.kyfb.kyfbdtofo.firmas.errores.Errores_kyfbfo_servicios;
import com.bbva.kyfb.kyfbdtofo.BdbziteDto;
import com.bbva.kyfb.kyfbdtofo.BuzonItem;
import com.bbva.kyfb.kyfbdtofo.FicheroRequest;
import com.bbva.kyfb.kyfbdtofo.RequestDto;
import com.bbva.kyfb.kyfbjpatlsb.dominiotlsb.Tbdbzbit;
import com.bbva.kyfb.kyfbjpatlsb.dominiotlsb.TbdbzbitPK;

@Repository
@SuppressWarnings("unchecked")
public class ServicioAsistentesDaoImpl implements ServicioAsistentesDao {

	protected EntityManager entityManager;
	protected EntityManager entityManagerTlsb;

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.bbva.kyfb.kyfbdaofo.implement.ServicioAsistentesDao#setEntityManager
	 * (javax.persistence.EntityManager)
	 */
	@Override
	@PersistenceContext(unitName = "persistenceUnitTLBH")
	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}
	
	@Override
	@PersistenceContext(unitName = "persistenceUnitTLSB")
	public void setEntityManagerTlsb(EntityManager entityManager) {
		this.entityManagerTlsb = entityManager;
	}
	
	@Override
	public List<Object[]> getEstados(String claseOrden, String numItem, String idOrden, String codcliecash) {
		try {
			String queryEstados = ArqSpringContext
					.getPropiedad("TLSB.TTLSBSFO.ESTADOS");
			Query query = entityManager.createNativeQuery(queryEstados);
			query.setParameter("COD_CLASEORD", claseOrden);
			query.setParameter("QNU_NUMITEM", numItem);
			query.setParameter("COD_IDORDEN", idOrden);
			query.setParameter("COD_CLIECASH", codcliecash);

			List<Object[]> resultList = query.getResultList();

			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}

	}

	@Override
	public List<Object[]> getDetalleFichero(String numItem, String timeStamp) {

		try{
			String queryDetalleFichero = ArqSpringContext.getPropiedad("TLSB.TTLSBSFO.TTLSBCAB.NOMASUNTO");
			Query query = entityManager.createNativeQuery(queryDetalleFichero);
	
			query.setParameter("QNU_NUMITEM", numItem);
			query.setParameter("TIM_FICHERO", timeStamp);
	
			List<Object[]> resultList = query.getResultList();
	
			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}

	}
	
	@Override
	public int actualizarBuzon(BuzonItem buzon) {				
		try {			
			String queryUpdateBuzon = ArqSpringContext.getPropiedad("TLSB.TBDBZBIT.UPDATEBUZON");
			Query query = entityManagerTlsb.createNativeQuery(queryUpdateBuzon);

			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSS");
			query.setParameter("TIM_FIRMA", sdf.parse(buzon.getFecha()));
			query.setParameter("COD_LOGONAPL", buzon.getLogon());
			query.setParameter("XTI_BUZON", buzon.getXtibuzon());
			query.setParameter("COD_CANALDI", buzon.getCanal());
			query.setParameter("COD_BANCOINT", buzon.getBancoInterno());
			query.setParameter("QNU_NUMITEM", buzon.getNumItem());
			
			return query.executeUpdate();
		}
		catch(ParseException parseException){
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
		catch (PropiedadNoEncontradaExcepcion propiedadNoEncontradaExcepcion) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
	}
	
	
	
	@Override
	public List<Object[]> getListaICD(String bancoInterno) {
		
		try{
			String queryListaICDs = ArqSpringContext.getPropiedad("TLSB.TBDBDICD.TBDSTPAI.LISTAICD");
			Query query = entityManagerTlsb.createNativeQuery(queryListaICDs);
			
			query.setParameter("COD_BANCOINT", bancoInterno);
			
			List<Object[]> resultList = query.getResultList();
			
			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
			
		}catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
		
	}
	
	@Override
	public List<Object[]> getListaControlAgrupacionesBuzones(String claseOrden, String canal, String bancoInterno) {
		
		try{
			String queryListaICDs = ArqSpringContext.getPropiedad("TLSB.TBDBZCAB.LISTACONTROLAGRUPBUZONES");
			Query query = entityManagerTlsb.createNativeQuery(queryListaICDs);
			
			query.setParameter("COD_TIPFICHR", claseOrden);
			query.setParameter("COD_CANALDI", Integer.valueOf(canal));
			query.setParameter("COD_BANCOINT", Integer.valueOf(bancoInterno));
			
			List<Object[]> resultList = query.getResultList();
			
			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
			
		}catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
		
	}
	
	@Override
	public List<Object[]> getListaExternalizacion(String bancoInterno) {
		
		try{
			String queryListaICDs = ArqSpringContext.getPropiedad("TLSB.TBDBDINI.LISTAEXTERNALIZACION");
			Query query = entityManagerTlsb.createNativeQuery(queryListaICDs);
			
			query.setParameter("COD_BANCOINT", bancoInterno);
			
			List<Object[]> resultList = query.getResultList();
			
			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
			
		}catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
		
	}
	

	@Override
	public List<Object[]> getEstructuraOrden(String tipoOrden) {
		try {
			String queryDefinicion = ArqSpringContext
					.getPropiedad("TLSB.TTLSBEOO.DEFINICION");
			Query query = entityManagerTlsb.createNativeQuery(queryDefinicion);
			query.setParameter("COD_TIPORD", tipoOrden);

			List<Object[]> resultList = query.getResultList();

			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
	}
	
	@Override
	public List<Object[]> getDatosOrden(String numItem, String timeStamp) {
		try {
			String queryDefinicion = ArqSpringContext
					.getPropiedad("TLSB.TTLSBOOL.LEERORD");
			Query query = entityManagerTlsb.createNativeQuery(queryDefinicion);
			query.setParameter("QNU_NUMITEM", numItem);
			query.setParameter("TIM_ORDEN", timeStamp);

			List<Object[]> resultList = query.getResultList();

			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
	}
	
	@Override
	public List<Object[]> getListaFormatoFichero(String bancoInterno, String claseOrden) {
		try {
			String queryDefinicion = ArqSpringContext
					.getPropiedad("TTLSB.TBDBZFMF.SELECT_FORMATO_FICHERO");
			Query query = entityManagerTlsb.createNativeQuery(queryDefinicion);
			query.setParameter("COD_BANCOINT", bancoInterno);
			query.setParameter("COD_CLASEORD", claseOrden);

			List<Object[]> resultList = query.getResultList();

			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
	}
	
	
	@Override
	public List<Object[]> getListaTratamientoFichero(String bancoInterno, String claseOrden) {
		try {
			String queryDefinicion = ArqSpringContext
					.getPropiedad("TLSB.TBDBZTVF.SELECT_OBTENER_ACCIONES");
			Query query = entityManagerTlsb.createNativeQuery(queryDefinicion);
			
			query.setParameter("COD_BANCOINT", bancoInterno);
			query.setParameter("COD_CLASEORD", claseOrden);

			List<Object[]> resultList = query.getResultList();

			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
	}
	
	@Override
	public int altaBuzonIt(RequestDto ficheroRequest, String xtiBuzon, long numItem, String fecha, String hora, int via){
				
		try{
			String queryUpdateBuzon = ArqSpringContext.getPropiedad("TLSB.TBDBZBIT.INSERT_BIT");
			Query query = entityManagerTlsb.createNativeQuery(queryUpdateBuzon);

			query.setParameter("COD_CANALDI", ficheroRequest.getCanal());
			query.setParameter("COD_LOGONAPL", ficheroRequest.getCodClieCash());
			query.setParameter("XTI_BUZON", xtiBuzon);
			query.setParameter("QNU_NUMITEM", numItem);
			query.setParameter("FEC_RECEPCIO", fecha);
			query.setParameter("HMS_RECEPCIO", hora);
			query.setParameter("COD_PID", via);
			
			int resultado = query.executeUpdate();
			
			if (resultado > 0) {
				return resultado;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
			
		}
		catch (PropiedadNoEncontradaExcepcion e2) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
	}
	
	@Override
	public int altaBuzonIte(BdbziteDto ite){
				
		try{
			String queryUpdateBuzon = ArqSpringContext.getPropiedad("TLSB.TBDBZITE.INSERT_ITE");
			Query query = entityManagerTlsb.createNativeQuery(queryUpdateBuzon);

			query.setParameter("QNU_NUMITEM", ite.getQNU_NUMITEM());
			query.setParameter("QNU_COPIA2", ite.getQNU_COPIA2());
			query.setParameter("DES_PATH", ite.getDES_PATH());
			query.setParameter("DES_REFERENC", ite.getDES_REFERENC());
			query.setParameter("DES_TIPFICHE", ite.getDES_TIPFICHE());
			query.setParameter("DES_NOMBRE", ite.getDES_NOMBRE());
			query.setParameter("DES_NOMFICHE", ite.getDES_NOMFICHE());
			query.setParameter("COD_COMREFEX", ite.getCOD_COMREFEX());
			query.setParameter("TIM_TIMESTAM", ite.getTIM_TIMESTAM());
			query.setParameter("COD_TIPDATO2", ite.getCOD_TIPDATO2());
			query.setParameter("DES_EMISOR", ite.getDES_EMISOR());
			query.setParameter("FEC_ENVIO", ite.getFEC_ENVIO());
			query.setParameter("HMS_ENVIO1", ite.getHMS_ENVIO1());
			query.setParameter("QNU_SIZE", ite.getQNU_SIZE());
			query.setParameter("DES_USUFIRMA", ite.getDES_USUFIRMA());
			query.setParameter("DES_CABECER1", ite.getDES_CABECER1());
			query.setParameter("COD_BANCOPR", ite.getCOD_BANCOPR());
			query.setParameter("COD_SUBPRODU", ite.getCOD_SUBPRODU());
			query.setParameter("COD_PRODSERV", ite.getCOD_PRODSERV());
			
			int resultado = query.executeUpdate();
			
			if (resultado > 0) {
				return resultado;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
			
		}
		catch (PropiedadNoEncontradaExcepcion e2) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
	}

	@Override
	public List<Object[]> getEstadoFicheroLogico(long numItem) {
		try {
			String queryDefinicion = ArqSpringContext
					.getPropiedad("TLSB.TBDBDBIT.SELECT");
			Query query = entityManagerTlsb.createNativeQuery(queryDefinicion);
			
			query.setParameter("QNU_NUMITEM", numItem);

			List<Object[]> resultList = query.getResultList();

			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
	}
	
	@Override
	public List<Object[]> getCodigoServicioGlobal(String claseOrden) {

		try{
			String queryCLO = ArqSpringContext.getPropiedad("TLSB.TTLSBCLO.SELECT_SERVICIO_GLOBAL");
			Query query = entityManager.createNativeQuery(queryCLO);
	
			query.setParameter("COD_CLASEORD", claseOrden);
	
			List<Object[]> resultList = query.getResultList();
	
			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}

	}
	
	@Override
	public List<Object[]> getListaServicioPermitidoCruzar(int servicioGlobal, int bancoInterno) {

		try{
			String queryListaServicio = ArqSpringContext.getPropiedad("BDCT.TBDCTSPC.LISTA_SERVICIO");
			Query query = entityManagerTlsb.createNativeQuery(queryListaServicio);
	
			query.setParameter("COD_SERCRUBD", servicioGlobal);
			query.setParameter("COD_BANCOINT", bancoInterno);
	
			List<Object[]> resultList = query.getResultList();
	
			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}

	}
	
	@Override
	public List<Object[]> getListarAsuntoCruzado(FicheroRequest fr,
			Vector<String> vDatos, int modo) {
		String queryListarAsuntoCruzado = "";
		Query query = null;
		try{
	
			switch (modo) {
			case 0:
				queryListarAsuntoCruzado = ArqSpringContext
						.getPropiedad("BDUS.TBDUSRFC.LISTAR_ASUNTO_CRUZADO0");
				break;
			case 1:
				queryListarAsuntoCruzado = ArqSpringContext
						.getPropiedad("BDUS.TBDUSRFC.LISTAR_ASUNTO_CRUZADO1");
				break;
			case 2:
				queryListarAsuntoCruzado = ArqSpringContext
						.getPropiedad("BDUS.TBDUSRFC.LISTAR_ASUNTO_CRUZADO2");
				break;
			}
			query = entityManagerTlsb
					.createNativeQuery(queryListarAsuntoCruzado);
			query.setParameter("COD_DLOGON", fr.getReferencia());
			query.setParameter("COD_DCANALDI", fr.getCanal());
			query.setParameter("COD_DBANCOIN", fr.getBancoInterno());
			query.setParameter("COD_DBANCOPR", fr.getBancoProducto());
			query.setParameter("COD_DPRODSER", fr.getProducto());
			query.setParameter("COD_DSUBPROD", fr.getSubproducto());
			query.setParameter("COD_DSERVICI", vDatos.get(0));
			query.setParameter("XTI_DTIPOASU", "O");
			
			switch(modo)
			{
			case 0:
				query.setParameter("COD_DBANCOAS", vDatos.get(1));
				break;
			case 2:
				query.setParameter("DES_DDATASOT", vDatos.get(1));
			case 1:
				query.setParameter("COD_DBANCOAS", vDatos.get(1));
				break;
			}
			
			List<Object[]> resultList = query.getResultList();
	
			if (resultList.size() > 0) {
				return resultList;
			} else {
				return null;
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}

	}
	
	@Override
	public int actualizarBuzonITE(String ref, long numItem){
				
		try{
			String queryUpdateBuzon = ArqSpringContext
					.getPropiedad("BDBZ.TBDBZITE.UPDATEBUZON");
			Query query = entityManagerTlsb.createNativeQuery(queryUpdateBuzon);

			query.setParameter("DES_REFERENC", ref);
			query.setParameter("QNU_NUMITEM", numItem);
			
			int resultado = query.executeUpdate();
			
			if (resultado > 0) {
				return resultado;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
			
		}
		catch (PropiedadNoEncontradaExcepcion e2) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
	}
	
	@Override
	public List<Object[]> asuntoEnReferenciaOrigen(FicheroRequest ficheroRequest, int iBancoAsuntoCruzado, int iServicioOrigen, int asunto) {

		try{
			String queryAsuntos = ArqSpringContext.getPropiedad("BDUS.TBDUSSER.CUENTA_ASUNTOS");
			Query query = entityManager.createNativeQuery(queryAsuntos);
			
			query.setParameter("COD_CANALDI", ficheroRequest.getCanal());
			query.setParameter("COD_BANCOINT", ficheroRequest.getBancoInterno());
			query.setParameter("COD_LOGONAPL", ficheroRequest.getReferencia());
			query.setParameter("COD_BANCOPR", ficheroRequest.getBancoProducto());
			query.setParameter("COD_PRODSERV", ficheroRequest.getProducto());
			query.setParameter("COD_SUBPRODU", ficheroRequest.getSubproducto());
			query.setParameter("COD_SERVICIO", iServicioOrigen);
			query.setParameter("DES_DATASOTR", asunto);
			query.setParameter("XTI_TIPOASUN", "O");
			query.setParameter("COD_BANCOASU", iBancoAsuntoCruzado);
	
			List<Object[]> resultList = query.getResultList();
	
			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}

	}
	
}
